

/*
Servidor em java utilizando socket e implementado atravez da interface ObjetoDistribuido
*/

import java.net.*;
import java.io.*;
import java.util.*;
import tools.command.*;
import tools.invoker.*;
import tools.ObjetoDistribuido.*;
import tools.command.commandInterface.*;


public class SocketClient extends ObjetoDistribuido { 
	

	//Declarações inicias
	private static ServerSocket socket1;
	private static int port;
	private static Socket connection;
	private static StringBuffer resposta = new StringBuffer();
	private static String tipo, host;
	private static int letra;
	private static SocketClient obj;
	private static Invoker  invoker ;



	/*--------------------------------------*/
	/*					*/
	/*	Implementação da interface 	*/
	/*	    Objeto distribuido		*/
	/*					*/
	/*--------------------------------------*/

	//implementação usage da interface
	public void usage(){
		System.out.println("Usage: \n $java socketClient host  port msg");
		System.out.println("\t host: \t\t nome do host a se conectar");
		System.out.println("\t port: \t\t Porto a ser utilizado");
		System.out.println("\t msg: \t\t mensagem a ser enviada");
	}

	//retorna a porta que irá se conectar
	public int getPort(){
		return this.port;
	}
	
	//seta qual porta deve ser escutada
	public void setPort(int port){
		this.port = port;
	}


	//implementação setTipo da interface
	public 	void setTipo(String tipo){

		this.tipo = tipo;	
		
	}

	//implementação getTipo da interface
	public 	String getTipo(){

		return this.tipo;
		
	}

	//implementação de fechamento da conexao 
	public	void fecha(){
		try{
			this.connection.close();
		}
		catch( IOException e){
			
			System.out.println("Não consegui fechar a conexão");
			System.exit(0);
		}
	}

	//implementação da função de escrita no canal
	public	void escreve(String envio){
		
		System.out.println("Socket iniciado para " + getHost() + " na porta "  + getPort());
		invoker.escreve(envio);

	}
	

	//implementação da função de leitura do canal
	public void recebe(){
		
		invoker.recebe();
	}


	/*--------------------------------------*/
	/*					*/
	/*	     Funções próprias		*/
	/*					*/
	/*--------------------------------------*/

	//Construtor 
	public SocketClient(String host, int porta){
		setPort(porta);
		setHost(host);
		setTipo("client");
		
	}
	public SocketClient(){
		setPort(2222);
		setHost("localhost");
		setTipo("client");
		
	}
	

	//retorna o nome do host
	public String getHost(){
		return this.host;
	}


	public void setHost(String host){
		this.host = host;
	}

	
	/* Função principal */
	public static void main(String[] args){
		
		 //verifica se foram passados 3 parametros
		 if ( args.length != 3){
			obj = new SocketClient();
			obj.usage();
		 }
		else{
			

			//Instancia o invoker
			invoker = new Invoker(args[0], Integer.parseInt(args[1]));


			//Instancia objeto client
			obj = new SocketClient(args[0],Integer.parseInt(args[1]));

			CommandGetTipo teste = new CommandGetTipo(obj);

			//incia connection no invoker				
			invoker.openConnectionClient();


			System.out.println(args.length);
	
			//envia informação para os servidor 
			obj.escreve(args[2]);

			//recebe resposta
			obj.recebe();
			teste.executa();


			//fecha connection
			invoker.closeConnection();
		}

	}
}

